データフレームからのデータの抽出


In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

練習問題

(1) 次の関数 create_dataset() を用いて、num=10 個のデータからなるデータフレーム data を作成します。その後、iterrowsメソッドを利用して、データポイント (x,y) のy値と関数 sin(2πx) の値について、平方根平均二乗誤差 √sum(sin(2πx) - y)**2 / num を計算してください。


In [2]:
from numpy.random import normal

def create_dataset(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    return DataFrame({'x': data_x, 'y': data_y})

In [3]:
data = create_dataset(10)
data


Out[3]:
x y
0 0.000000 -0.477116
1 0.111111 0.346336
2 0.222222 1.189618
3 0.333333 0.732427
4 0.444444 0.715236
5 0.555556 -0.257313
6 0.666667 -1.070755
7 0.777778 -0.510098
8 0.888889 -1.057133
9 1.000000 -0.423112

In [4]:
square_error = 0.0
for i, line in data.iterrows():
    square_error += (np.sin(2*np.pi*line.x) - line.y) ** 2
rmse = np.sqrt(square_error / len(data))
rmse


Out[4]:
0.33760231834827642

(2) (1)のDataFrameから列 'x' だけを取り出したSeriesオブジェクトを変数 x に格納してください。さらに、x**2 (各要素を2乗した値)を要素とするSeriesオブジェクトを作成して、変数 x2 に格納してください。同様に、x**3、x**4 を要素とするSeriesオブジェクトを変数 x3, x4 に格納します。それぞれのSeriesオブジェクトのnameプロパティは、'x2', 'x3', 'x4' とします。


In [5]:
x = create_dataset(10).x
x2 = x**2
x2.name = 'x2'
x3 = x**3
x3.name = 'x3'
x4 = x**4
x4.name = 'x4'

(3) (2)で作成した x, x2, x3, x4 を結合して、x, x2, x3, x4を列に持ったデータフレーム dataset を作成してください。


In [6]:
dataset = pd.concat([x,x2, x3, x4], axis=1)
dataset


Out[6]:
x x2 x3 x4
0 0.000000 0.000000 0.000000 0.000000
1 0.111111 0.012346 0.001372 0.000152
2 0.222222 0.049383 0.010974 0.002439
3 0.333333 0.111111 0.037037 0.012346
4 0.444444 0.197531 0.087791 0.039018
5 0.555556 0.308642 0.171468 0.095260
6 0.666667 0.444444 0.296296 0.197531
7 0.777778 0.604938 0.470508 0.365950
8 0.888889 0.790123 0.702332 0.624295
9 1.000000 1.000000 1.000000 1.000000